NOTEBOOK Description 📗¶This notebook contains the below improvements done on the best performing model to achieve better results:
Hyper-parameterized best performing model (DenseNet-121 -- Adam -- 0.0005)Improvement - 1Focal Loss in-place of Cross Entropy to deal with the class imbalance problemLabel Smoothing to reduce the chances of overfitting of the modelImprovement - 2CNN feature extractor then training the ML models on DL based features to yield better resultsImport_Libraries¶!pip install tensorflow-addons
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting tensorflow-addons
Downloading tensorflow_addons-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)
|████████████████████████████████| 1.1 MB 4.8 MB/s
Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from tensorflow-addons) (21.3)
Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.7/dist-packages (from tensorflow-addons) (2.7.1)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->tensorflow-addons) (3.0.9)
Installing collected packages: tensorflow-addons
Successfully installed tensorflow-addons-0.18.0
!pip install tf-explain
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting tf-explain
Downloading tf_explain-0.3.1-py3-none-any.whl (43 kB)
|████████████████████████████████| 43 kB 1.4 MB/s
Installing collected packages: tf-explain
Successfully installed tf-explain-0.3.1
import os
import sys
import math
import scipy as scipy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import cv2
from IPython.display import display
from sklearn.utils import class_weight
from PIL import Image
from tqdm import tqdm
tqdm.pandas()
%matplotlib inline
pd.set_option('display.max_columns', 30)
label_font_dict = {'family':'sans-serif','size':13.5,'color':'brown','style':'italic'}
ticks_font_dict = {'family':'sans-serif','size':11,'color':'black','style':'italic'}
title_font_dict = {'family':'sans-serif','size':17.5,'color':'Blue','style':'italic'}
Data_Loading¶import random as rn
import datetime
import time
import pathlib
import tensorflow as tf
import tensorflow_addons as tfa
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input, Dropout, BatchNormalization, Activation, Flatten, Conv1D, Conv2D, Concatenate, Lambda
from tensorflow.keras.optimizers import Adam, RMSprop
from tensorflow.keras.utils import plot_model
from tensorflow.keras.layers import MaxPool1D, MaxPool2D, GlobalAveragePooling1D, GlobalAveragePooling2D, AveragePooling1D, AveragePooling2D, SpatialDropout2D
from keras.regularizers import l1, l2
from keras.preprocessing import image
from keras.callbacks import Callback
from keras.callbacks import TensorBoard
from sklearn.metrics import accuracy_score, recall_score, f1_score, precision_score, roc_auc_score, confusion_matrix
from tensorboard import notebook
from keras.callbacks import Callback, EarlyStopping, ModelCheckpoint,LearningRateScheduler
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import model_from_json
# Downloading the X_train, y_train, X_test, y_test files
!gdown 13rK96P8FE9OBbm2ckVkRW46LbXUT4KWl
!gdown 1WLumZ9OH5ZivlnDYB1niWc691mWhYQnB
!gdown 1nP8_94jbhV-_QBHSsZ9tOapV0WhFl7bd
!gdown 15dNrBXpZGcmkBWuOSV-JhR-j2d87kXtt
# Downloading weights of BEST MODEL & Model JSON file
!gdown 1zT56juJ7lYLrpV5gkCz3peeYeSgbRdai
!gdown 1-SzFlvim2ShSm0ispV1zBRLhwAftTgf_
Downloading... From: https://drive.google.com/uc?id=13rK96P8FE9OBbm2ckVkRW46LbXUT4KWl To: /content/X_test.npz 100% 440M/440M [00:04<00:00, 97.7MB/s] Downloading... From: https://drive.google.com/uc?id=1WLumZ9OH5ZivlnDYB1niWc691mWhYQnB To: /content/y_test.npz 100% 6.10k/6.10k [00:00<00:00, 7.07MB/s] Downloading... From: https://drive.google.com/uc?id=1nP8_94jbhV-_QBHSsZ9tOapV0WhFl7bd To: /content/y_train.npz 100% 178k/178k [00:00<00:00, 52.3MB/s] Downloading... From: https://drive.google.com/uc?id=15dNrBXpZGcmkBWuOSV-JhR-j2d87kXtt To: /content/X_train.npz 100% 6.71G/6.71G [01:13<00:00, 90.7MB/s] Downloading... From: https://drive.google.com/uc?id=1zT56juJ7lYLrpV5gkCz3peeYeSgbRdai To: /content/weights-14-0.0253.hdf5 100% 87.9M/87.9M [00:01<00:00, 58.5MB/s] Downloading... From: https://drive.google.com/uc?id=1-SzFlvim2ShSm0ispV1zBRLhwAftTgf_ To: /content/DenseNet_Model.json 100% 203k/203k [00:00<00:00, 95.1MB/s]
# Downloading the weights of BEST MODEL Confg + FOCAL LOSS + Label Smoothing
!gdown 1HdgMwjlEtLnDL2s6Mi7op6HX-uWOFUC9
Downloading... From: https://drive.google.com/uc?id=1HdgMwjlEtLnDL2s6Mi7op6HX-uWOFUC9 To: /content/weights-09-0.0277.hdf5 100% 87.9M/87.9M [00:00<00:00, 230MB/s]
# Loading the X_train, y_train, X_test & y_test files in memory
x_train_file = np.load("X_train.npz")
X_train = x_train_file.f.arr_0
y_train_file = np.load("y_train.npz")
y_train = y_train_file.f.arr_0
x_test_file = np.load("X_test.npz")
X_test = x_test_file.f.arr_0
y_test_file = np.load("y_test.npz")
y_test = y_test_file.f.arr_0
# Saving the memory;
del x_train_file;
del y_train_file;
del x_test_file;
del y_test_file;
# Checking types of TRAIN, VAL & TEST sets
type(X_train), type(y_train), type(X_test), type(y_test)
(numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray)
# Checking shapes of TRAIN, VAL & TEST sets
X_train.shape, y_train.shape, X_test.shape, y_test.shape
((11138, 224, 224, 3), (11138, 4), (365, 224, 224, 3), (365, 4))
Calculating_Class_Weights¶y_train.shape
(11138, 4)
cols = ['Healthy', 'Multiple_Diseases', 'Rust', 'Scab']
tmp_cw = pd.DataFrame(y_train, columns=cols)
tmp_cw
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.0 | 0.0 | 0.0 | 1.0 |
| 1 | 0.0 | 0.0 | 1.0 | 0.0 |
| 2 | 0.0 | 0.0 | 0.0 | 1.0 |
| 3 | 0.0 | 0.0 | 1.0 | 0.0 |
| 4 | 0.0 | 0.0 | 0.0 | 1.0 |
| ... | ... | ... | ... | ... |
| 11133 | 1.0 | 0.0 | 0.0 | 0.0 |
| 11134 | 1.0 | 0.0 | 0.0 | 0.0 |
| 11135 | 1.0 | 0.0 | 0.0 | 0.0 |
| 11136 | 0.0 | 0.0 | 0.0 | 1.0 |
| 11137 | 1.0 | 0.0 | 0.0 | 0.0 |
11138 rows × 4 columns
def class_label(hl, md, rs, sc):
"""
Description : This function is created for assigning the class label tag.
"""
if hl == 1:
return 0
elif md == 1:
return 1
elif rs == 1:
return 2
elif sc == 1:
return 3
tmp_cw['label'] = tmp_cw[['Healthy', 'Multiple_Diseases', 'Rust', 'Scab']].apply(lambda row: class_label(row['Healthy'],
row['Multiple_Diseases'],
row['Rust'],
row['Scab']), axis=1)
np.unique(tmp_cw['label'].values)
array([0, 1, 2, 3])
# Calculating the class weights
cw1 = class_weight.compute_class_weight('balanced', classes = np.unique(tmp_cw['label'].values), y=tmp_cw['label'].values)
cw1
array([0.88621897, 4.95462633, 0.72816423, 0.77132964])
# Storing the weights as a dict
cw1_dict = {0:cw1[0], 1:cw1[1], 2:cw1[2], 3:cw1[3]}
cw1_dict
{0: 0.8862189688096753,
1: 4.954626334519573,
2: 0.7281642259414226,
3: 0.7713296398891967}
Defining_Performance_Metrics¶# Declaring the metrics
tfa_f1_scr = tfa.metrics.F1Score(num_classes=4, average='macro')
# Defining the AUC Score method
def auc_score(y_true, y_pred):
"""
Description : This function is created for returning ROC AUC Score.
"""
if len(np.unique(y_true[:,1])) == 1:
return 0.5
else:
return roc_auc_score(y_true, y_pred)
# Calculating the AUC score
def auc(y_true, y_pred):
"""
Description : This function is created for defining the ROC AUC function as a TF function for graph computation.
"""
score = tf.py_function(auc_score, [y_true, y_pred], 'float32', name='sklearnAUC')
return score
cols = ['Healthy', 'Multiple_Diseases', 'Rust', 'Scab'];
# Generating the multi-class confusion matrix for seeing the classification results
def confusion_matrix_(actual_labels, dataset, model, BATCH_SIZE=32):
"""
Description : This function is created for generating the confusion matrix for all the tgt classes.
"""
# Model predictions
y_pred = model.predict(dataset, batch_size=BATCH_SIZE)
# Storing the predictions in the form of 0 or 1
for i in range(y_pred.shape[0]):
y_pred[i] = np.where(y_pred[i] == y_pred[i].max(), 1, 0)
# Storing the actual labels for all tgt classes
actual_healthy = np.choose([0], actual_labels.T)
actual_multiple_diseases = np.choose([1], actual_labels.T)
actual_rust = np.choose([2], actual_labels.T)
actual_scab = np.choose([3], actual_labels.T)
# Storing the predicted labels for all tgt classes
predicted_healthy = np.choose([0], y_pred.T)
predicted_multiple_diseases = np.choose([1], y_pred.T)
predicted_rust = np.choose([2], y_pred.T)
predicted_scab = np.choose([3], y_pred.T)
# Generating the perf metrics score
## Accuracy
calc_acc = tf.keras.metrics.BinaryAccuracy()
calc_acc.update_state(actual_healthy, predicted_healthy)
acc_healthy = calc_acc.result().numpy()
calc_acc.update_state(actual_multiple_diseases, predicted_multiple_diseases)
acc_md = calc_acc.result().numpy()
calc_acc.update_state(actual_rust, predicted_rust)
acc_rust = calc_acc.result().numpy()
calc_acc.update_state(actual_scab, predicted_scab)
acc_scab = calc_acc.result().numpy()
acc_df = pd.DataFrame(np.array([acc_healthy, acc_md, acc_rust, acc_scab])).T
acc_df.columns = cols
acc_df.index = ["BINARY Accuracy"]
## Precision
calc_prec = tf.keras.metrics.Precision()
calc_prec.update_state(actual_healthy, predicted_healthy)
prec_healthy = calc_prec.result().numpy()
calc_prec.update_state(actual_multiple_diseases, predicted_multiple_diseases)
prec_md = calc_prec.result().numpy()
calc_prec.update_state(actual_rust, predicted_rust)
prec_rust = calc_prec.result().numpy()
calc_prec.update_state(actual_scab, predicted_scab)
prec_scab = calc_prec.result().numpy()
prec_df = pd.DataFrame(np.array([prec_healthy, prec_md, prec_rust, prec_scab])).T
prec_df.columns = cols
prec_df.index = ["Precision"]
## Recall
calc_rec = tf.keras.metrics.Recall()
calc_rec.update_state(actual_healthy, predicted_healthy)
rec_healthy = calc_rec.result().numpy()
calc_rec.update_state(actual_multiple_diseases, predicted_multiple_diseases)
rec_md = calc_rec.result().numpy()
calc_rec.update_state(actual_rust, predicted_rust)
rec_rust = calc_rec.result().numpy()
calc_rec.update_state(actual_scab, predicted_scab)
rec_scab = calc_rec.result().numpy()
rec_df = pd.DataFrame(np.array([rec_healthy, rec_md, rec_rust, rec_scab])).T
rec_df.columns = cols
rec_df.index = ["Recall"]
## F1 Score
f1_scr_hl = f1_score(actual_healthy, predicted_healthy, average='macro')
f1_scr_md = f1_score(actual_multiple_diseases, predicted_multiple_diseases, average='macro')
f1_scr_rs = f1_score(actual_rust, predicted_rust, average='macro')
f1_scr_sc = f1_score(actual_scab, predicted_scab, average='macro')
f1_scr_df = pd.DataFrame(np.array([f1_scr_hl, f1_scr_md, f1_scr_rs, f1_scr_sc])).T
f1_scr_df.columns = cols
f1_scr_df.index = ["Macro F1 Score"]
## ROC AUC Score
roc_auc_scr_hl = roc_auc_score(actual_healthy, predicted_healthy, average='macro')
roc_auc_scr_md = roc_auc_score(actual_multiple_diseases, predicted_multiple_diseases, average='macro')
roc_auc_scr_rs = roc_auc_score(actual_rust, predicted_rust, average='macro')
roc_auc_scr_sc = roc_auc_score(actual_scab, predicted_scab, average='macro')
roc_auc_scr_df = pd.DataFrame(np.array([roc_auc_scr_hl, roc_auc_scr_md, roc_auc_scr_rs, roc_auc_scr_sc])).T
roc_auc_scr_df.columns = cols
roc_auc_scr_df.index = ["Macro ROC AUC Score"]
## Final Results
results_df = pd.concat([acc_df, prec_df, rec_df, f1_scr_df, roc_auc_scr_df], axis=0)
results_df = results_df.applymap(lambda val: np.round(val,4))
# Plotting the confusion matrix
with plt.style.context('seaborn-poster'):
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(16,14), sharex=False, sharey=False)
# CM for healthy class
cm1 = confusion_matrix(actual_healthy, predicted_healthy,labels=[0,1])
sns.heatmap(cm1, annot=True, cmap="plasma", fmt=".3f", xticklabels = ['Not Healthy','Healthy'], yticklabels = ['Not Healthy','Healthy'], cbar=False, ax=ax[0,0])
ax[0,0].set_xlabel('Predicted', fontdict=label_font_dict)
ax[0,0].set_ylabel('Actual', fontdict=label_font_dict)
ax0_xticks = ax[0,0].get_yticklabels()
ax0_yticks = ax[0,0].get_yticklabels()
ax[0,0].set_xticklabels(labels = ax0_xticks, fontdict=ticks_font_dict)
ax[0,0].set_yticklabels(labels = ax0_xticks, fontdict=ticks_font_dict)
ax[0,0].set_title("Healthy", fontdict=title_font_dict)
# CM for mutiple diseases class
cm2 = confusion_matrix(actual_multiple_diseases, predicted_multiple_diseases,labels=[0,1])
sns.heatmap(cm2, annot=True, cmap="plasma", fmt=".3f", xticklabels = ['No M.D','M.D'], yticklabels = ['No M.D','M.D'], cbar=False, ax=ax[0,1])
ax[0,1].set_xlabel('Predicted', fontdict=label_font_dict)
ax[0,1].set_ylabel('Actual', fontdict=label_font_dict)
ax1_xticks = ax[0,1].get_yticklabels()
ax1_yticks = ax[0,1].get_yticklabels()
ax[0,1].set_xticklabels(labels = ax1_xticks, fontdict=ticks_font_dict)
ax[0,1].set_yticklabels(labels = ax1_xticks, fontdict=ticks_font_dict)
ax[0,1].set_title("Multiple Diseases", fontdict=title_font_dict)
# CM for rust class
cm3 = confusion_matrix(actual_rust, predicted_rust,labels=[0,1])
sns.heatmap(cm3, annot=True, cmap="plasma", fmt=".3f", xticklabels = ['No Rust','Rust'], yticklabels = ['No Rust','Rust'], cbar=False, ax=ax[1,0])
ax[1,0].set_xlabel('Predicted', fontdict=label_font_dict)
ax[1,0].set_ylabel('Actual', fontdict=label_font_dict)
ax2_xticks = ax[1,0].get_yticklabels()
ax2_yticks = ax[1,0].get_yticklabels()
ax[1,0].set_xticklabels(labels = ax2_xticks, fontdict=ticks_font_dict)
ax[1,0].set_yticklabels(labels = ax2_xticks, fontdict=ticks_font_dict)
ax[1,0].set_title("Rust", fontdict=title_font_dict)
# CM for scab class
cm4 = confusion_matrix(actual_scab, predicted_scab,labels=[0,1])
sns.heatmap(cm4, annot=True, cmap="plasma", fmt=".3f", xticklabels = ['No Scab','Scab'], yticklabels = ['No Scab','Scab'], cbar=False, ax=ax[1,1])
ax[1,1].set_xlabel('Predicted', fontdict=label_font_dict)
ax[1,1].set_ylabel('Actual', fontdict=label_font_dict)
ax3_xticks = ax[1,1].get_yticklabels()
ax3_yticks = ax[1,1].get_yticklabels()
ax[1,1].set_xticklabels(labels = ax3_xticks, fontdict=ticks_font_dict)
ax[1,1].set_yticklabels(labels = ax3_xticks, fontdict=ticks_font_dict)
ax[1,1].set_title("Scab", fontdict=title_font_dict)
plt.show()
return results_df
Model_Configuration¶# Defining the batch-size
BATCH_SIZE = 32
# Using the AUTOTUNE algo for better allocation of computing resources for Dataset pipeline
AUTO = tf.data.experimental.AUTOTUNE
tf.autograph.experimental.do_not_convert(func=None)
<function tensorflow.python.autograph.impl.api.do_not_convert(func=None)>
# Size of TRAIN & VALIDATION labels and BATCH SIZE
y_train.shape[0], BATCH_SIZE, """y_val.shape[0]"""
(11138, 32, 'y_val.shape[0]')
# Calculating train steps
train_steps = y_train.shape[0] // BATCH_SIZE
train_steps
348
# Calculating test steps
valid_steps = y_val.shape[0] // BATCH_SIZE
valid_steps
# Printing class weights
cw1_dict
{0: 0.8862189688096753,
1: 4.954626334519573,
2: 0.7281642259414226,
3: 0.7713296398891967}
tf.autograph.experimental.do_not_convert(func=None)
<function tensorflow.python.autograph.impl.api.do_not_convert(func=None)>
Best_Model¶# loading Models' JSON and creating the Model
with open('DenseNet_Model.json', 'r') as model_json_file:
loaded_model_json = model_json_file.read()
# Loading the model from json
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("/content/weights-14-0.0253.hdf5")
# Printing Model summary
loaded_model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 224, 224, 3 0 []
)]
zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_1[0][0]']
conv1/conv (Conv2D) (None, 112, 112, 64 9408 ['zero_padding2d[0][0]']
)
conv1/bn (BatchNormalization) (None, 112, 112, 64 256 ['conv1/conv[0][0]']
)
conv1/relu (Activation) (None, 112, 112, 64 0 ['conv1/bn[0][0]']
)
zero_padding2d_1 (ZeroPadding2 (None, 114, 114, 64 0 ['conv1/relu[0][0]']
D) )
pool1 (MaxPooling2D) (None, 56, 56, 64) 0 ['zero_padding2d_1[0][0]']
conv2_block1_0_bn (BatchNormal (None, 56, 56, 64) 256 ['pool1[0][0]']
ization)
conv2_block1_0_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block1_0_bn[0][0]']
n)
conv2_block1_1_conv (Conv2D) (None, 56, 56, 128) 8192 ['conv2_block1_0_relu[0][0]']
conv2_block1_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block1_1_conv[0][0]']
ization)
conv2_block1_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block1_1_bn[0][0]']
n)
conv2_block1_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block1_1_relu[0][0]']
conv2_block1_concat (Concatena (None, 56, 56, 96) 0 ['pool1[0][0]',
te) 'conv2_block1_2_conv[0][0]']
conv2_block2_0_bn (BatchNormal (None, 56, 56, 96) 384 ['conv2_block1_concat[0][0]']
ization)
conv2_block2_0_relu (Activatio (None, 56, 56, 96) 0 ['conv2_block2_0_bn[0][0]']
n)
conv2_block2_1_conv (Conv2D) (None, 56, 56, 128) 12288 ['conv2_block2_0_relu[0][0]']
conv2_block2_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block2_1_conv[0][0]']
ization)
conv2_block2_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block2_1_bn[0][0]']
n)
conv2_block2_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block2_1_relu[0][0]']
conv2_block2_concat (Concatena (None, 56, 56, 128) 0 ['conv2_block1_concat[0][0]',
te) 'conv2_block2_2_conv[0][0]']
conv2_block3_0_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block2_concat[0][0]']
ization)
conv2_block3_0_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block3_0_bn[0][0]']
n)
conv2_block3_1_conv (Conv2D) (None, 56, 56, 128) 16384 ['conv2_block3_0_relu[0][0]']
conv2_block3_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block3_1_conv[0][0]']
ization)
conv2_block3_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block3_1_bn[0][0]']
n)
conv2_block3_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block3_1_relu[0][0]']
conv2_block3_concat (Concatena (None, 56, 56, 160) 0 ['conv2_block2_concat[0][0]',
te) 'conv2_block3_2_conv[0][0]']
conv2_block4_0_bn (BatchNormal (None, 56, 56, 160) 640 ['conv2_block3_concat[0][0]']
ization)
conv2_block4_0_relu (Activatio (None, 56, 56, 160) 0 ['conv2_block4_0_bn[0][0]']
n)
conv2_block4_1_conv (Conv2D) (None, 56, 56, 128) 20480 ['conv2_block4_0_relu[0][0]']
conv2_block4_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block4_1_conv[0][0]']
ization)
conv2_block4_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block4_1_bn[0][0]']
n)
conv2_block4_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block4_1_relu[0][0]']
conv2_block4_concat (Concatena (None, 56, 56, 192) 0 ['conv2_block3_concat[0][0]',
te) 'conv2_block4_2_conv[0][0]']
conv2_block5_0_bn (BatchNormal (None, 56, 56, 192) 768 ['conv2_block4_concat[0][0]']
ization)
conv2_block5_0_relu (Activatio (None, 56, 56, 192) 0 ['conv2_block5_0_bn[0][0]']
n)
conv2_block5_1_conv (Conv2D) (None, 56, 56, 128) 24576 ['conv2_block5_0_relu[0][0]']
conv2_block5_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block5_1_conv[0][0]']
ization)
conv2_block5_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block5_1_bn[0][0]']
n)
conv2_block5_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block5_1_relu[0][0]']
conv2_block5_concat (Concatena (None, 56, 56, 224) 0 ['conv2_block4_concat[0][0]',
te) 'conv2_block5_2_conv[0][0]']
conv2_block6_0_bn (BatchNormal (None, 56, 56, 224) 896 ['conv2_block5_concat[0][0]']
ization)
conv2_block6_0_relu (Activatio (None, 56, 56, 224) 0 ['conv2_block6_0_bn[0][0]']
n)
conv2_block6_1_conv (Conv2D) (None, 56, 56, 128) 28672 ['conv2_block6_0_relu[0][0]']
conv2_block6_1_bn (BatchNormal (None, 56, 56, 128) 512 ['conv2_block6_1_conv[0][0]']
ization)
conv2_block6_1_relu (Activatio (None, 56, 56, 128) 0 ['conv2_block6_1_bn[0][0]']
n)
conv2_block6_2_conv (Conv2D) (None, 56, 56, 32) 36864 ['conv2_block6_1_relu[0][0]']
conv2_block6_concat (Concatena (None, 56, 56, 256) 0 ['conv2_block5_concat[0][0]',
te) 'conv2_block6_2_conv[0][0]']
pool2_bn (BatchNormalization) (None, 56, 56, 256) 1024 ['conv2_block6_concat[0][0]']
pool2_relu (Activation) (None, 56, 56, 256) 0 ['pool2_bn[0][0]']
pool2_conv (Conv2D) (None, 56, 56, 128) 32768 ['pool2_relu[0][0]']
pool2_pool (AveragePooling2D) (None, 28, 28, 128) 0 ['pool2_conv[0][0]']
conv3_block1_0_bn (BatchNormal (None, 28, 28, 128) 512 ['pool2_pool[0][0]']
ization)
conv3_block1_0_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block1_0_bn[0][0]']
n)
conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 16384 ['conv3_block1_0_relu[0][0]']
conv3_block1_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block1_1_conv[0][0]']
ization)
conv3_block1_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block1_1_bn[0][0]']
n)
conv3_block1_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block1_1_relu[0][0]']
conv3_block1_concat (Concatena (None, 28, 28, 160) 0 ['pool2_pool[0][0]',
te) 'conv3_block1_2_conv[0][0]']
conv3_block2_0_bn (BatchNormal (None, 28, 28, 160) 640 ['conv3_block1_concat[0][0]']
ization)
conv3_block2_0_relu (Activatio (None, 28, 28, 160) 0 ['conv3_block2_0_bn[0][0]']
n)
conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 20480 ['conv3_block2_0_relu[0][0]']
conv3_block2_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block2_1_conv[0][0]']
ization)
conv3_block2_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block2_1_bn[0][0]']
n)
conv3_block2_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block2_1_relu[0][0]']
conv3_block2_concat (Concatena (None, 28, 28, 192) 0 ['conv3_block1_concat[0][0]',
te) 'conv3_block2_2_conv[0][0]']
conv3_block3_0_bn (BatchNormal (None, 28, 28, 192) 768 ['conv3_block2_concat[0][0]']
ization)
conv3_block3_0_relu (Activatio (None, 28, 28, 192) 0 ['conv3_block3_0_bn[0][0]']
n)
conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 24576 ['conv3_block3_0_relu[0][0]']
conv3_block3_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block3_1_conv[0][0]']
ization)
conv3_block3_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block3_1_bn[0][0]']
n)
conv3_block3_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block3_1_relu[0][0]']
conv3_block3_concat (Concatena (None, 28, 28, 224) 0 ['conv3_block2_concat[0][0]',
te) 'conv3_block3_2_conv[0][0]']
conv3_block4_0_bn (BatchNormal (None, 28, 28, 224) 896 ['conv3_block3_concat[0][0]']
ization)
conv3_block4_0_relu (Activatio (None, 28, 28, 224) 0 ['conv3_block4_0_bn[0][0]']
n)
conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 28672 ['conv3_block4_0_relu[0][0]']
conv3_block4_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block4_1_conv[0][0]']
ization)
conv3_block4_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block4_1_bn[0][0]']
n)
conv3_block4_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block4_1_relu[0][0]']
conv3_block4_concat (Concatena (None, 28, 28, 256) 0 ['conv3_block3_concat[0][0]',
te) 'conv3_block4_2_conv[0][0]']
conv3_block5_0_bn (BatchNormal (None, 28, 28, 256) 1024 ['conv3_block4_concat[0][0]']
ization)
conv3_block5_0_relu (Activatio (None, 28, 28, 256) 0 ['conv3_block5_0_bn[0][0]']
n)
conv3_block5_1_conv (Conv2D) (None, 28, 28, 128) 32768 ['conv3_block5_0_relu[0][0]']
conv3_block5_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block5_1_conv[0][0]']
ization)
conv3_block5_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block5_1_bn[0][0]']
n)
conv3_block5_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block5_1_relu[0][0]']
conv3_block5_concat (Concatena (None, 28, 28, 288) 0 ['conv3_block4_concat[0][0]',
te) 'conv3_block5_2_conv[0][0]']
conv3_block6_0_bn (BatchNormal (None, 28, 28, 288) 1152 ['conv3_block5_concat[0][0]']
ization)
conv3_block6_0_relu (Activatio (None, 28, 28, 288) 0 ['conv3_block6_0_bn[0][0]']
n)
conv3_block6_1_conv (Conv2D) (None, 28, 28, 128) 36864 ['conv3_block6_0_relu[0][0]']
conv3_block6_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block6_1_conv[0][0]']
ization)
conv3_block6_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block6_1_bn[0][0]']
n)
conv3_block6_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block6_1_relu[0][0]']
conv3_block6_concat (Concatena (None, 28, 28, 320) 0 ['conv3_block5_concat[0][0]',
te) 'conv3_block6_2_conv[0][0]']
conv3_block7_0_bn (BatchNormal (None, 28, 28, 320) 1280 ['conv3_block6_concat[0][0]']
ization)
conv3_block7_0_relu (Activatio (None, 28, 28, 320) 0 ['conv3_block7_0_bn[0][0]']
n)
conv3_block7_1_conv (Conv2D) (None, 28, 28, 128) 40960 ['conv3_block7_0_relu[0][0]']
conv3_block7_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block7_1_conv[0][0]']
ization)
conv3_block7_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block7_1_bn[0][0]']
n)
conv3_block7_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block7_1_relu[0][0]']
conv3_block7_concat (Concatena (None, 28, 28, 352) 0 ['conv3_block6_concat[0][0]',
te) 'conv3_block7_2_conv[0][0]']
conv3_block8_0_bn (BatchNormal (None, 28, 28, 352) 1408 ['conv3_block7_concat[0][0]']
ization)
conv3_block8_0_relu (Activatio (None, 28, 28, 352) 0 ['conv3_block8_0_bn[0][0]']
n)
conv3_block8_1_conv (Conv2D) (None, 28, 28, 128) 45056 ['conv3_block8_0_relu[0][0]']
conv3_block8_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block8_1_conv[0][0]']
ization)
conv3_block8_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block8_1_bn[0][0]']
n)
conv3_block8_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block8_1_relu[0][0]']
conv3_block8_concat (Concatena (None, 28, 28, 384) 0 ['conv3_block7_concat[0][0]',
te) 'conv3_block8_2_conv[0][0]']
conv3_block9_0_bn (BatchNormal (None, 28, 28, 384) 1536 ['conv3_block8_concat[0][0]']
ization)
conv3_block9_0_relu (Activatio (None, 28, 28, 384) 0 ['conv3_block9_0_bn[0][0]']
n)
conv3_block9_1_conv (Conv2D) (None, 28, 28, 128) 49152 ['conv3_block9_0_relu[0][0]']
conv3_block9_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block9_1_conv[0][0]']
ization)
conv3_block9_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block9_1_bn[0][0]']
n)
conv3_block9_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block9_1_relu[0][0]']
conv3_block9_concat (Concatena (None, 28, 28, 416) 0 ['conv3_block8_concat[0][0]',
te) 'conv3_block9_2_conv[0][0]']
conv3_block10_0_bn (BatchNorma (None, 28, 28, 416) 1664 ['conv3_block9_concat[0][0]']
lization)
conv3_block10_0_relu (Activati (None, 28, 28, 416) 0 ['conv3_block10_0_bn[0][0]']
on)
conv3_block10_1_conv (Conv2D) (None, 28, 28, 128) 53248 ['conv3_block10_0_relu[0][0]']
conv3_block10_1_bn (BatchNorma (None, 28, 28, 128) 512 ['conv3_block10_1_conv[0][0]']
lization)
conv3_block10_1_relu (Activati (None, 28, 28, 128) 0 ['conv3_block10_1_bn[0][0]']
on)
conv3_block10_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block10_1_relu[0][0]']
conv3_block10_concat (Concaten (None, 28, 28, 448) 0 ['conv3_block9_concat[0][0]',
ate) 'conv3_block10_2_conv[0][0]']
conv3_block11_0_bn (BatchNorma (None, 28, 28, 448) 1792 ['conv3_block10_concat[0][0]']
lization)
conv3_block11_0_relu (Activati (None, 28, 28, 448) 0 ['conv3_block11_0_bn[0][0]']
on)
conv3_block11_1_conv (Conv2D) (None, 28, 28, 128) 57344 ['conv3_block11_0_relu[0][0]']
conv3_block11_1_bn (BatchNorma (None, 28, 28, 128) 512 ['conv3_block11_1_conv[0][0]']
lization)
conv3_block11_1_relu (Activati (None, 28, 28, 128) 0 ['conv3_block11_1_bn[0][0]']
on)
conv3_block11_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block11_1_relu[0][0]']
conv3_block11_concat (Concaten (None, 28, 28, 480) 0 ['conv3_block10_concat[0][0]',
ate) 'conv3_block11_2_conv[0][0]']
conv3_block12_0_bn (BatchNorma (None, 28, 28, 480) 1920 ['conv3_block11_concat[0][0]']
lization)
conv3_block12_0_relu (Activati (None, 28, 28, 480) 0 ['conv3_block12_0_bn[0][0]']
on)
conv3_block12_1_conv (Conv2D) (None, 28, 28, 128) 61440 ['conv3_block12_0_relu[0][0]']
conv3_block12_1_bn (BatchNorma (None, 28, 28, 128) 512 ['conv3_block12_1_conv[0][0]']
lization)
conv3_block12_1_relu (Activati (None, 28, 28, 128) 0 ['conv3_block12_1_bn[0][0]']
on)
conv3_block12_2_conv (Conv2D) (None, 28, 28, 32) 36864 ['conv3_block12_1_relu[0][0]']
conv3_block12_concat (Concaten (None, 28, 28, 512) 0 ['conv3_block11_concat[0][0]',
ate) 'conv3_block12_2_conv[0][0]']
pool3_bn (BatchNormalization) (None, 28, 28, 512) 2048 ['conv3_block12_concat[0][0]']
pool3_relu (Activation) (None, 28, 28, 512) 0 ['pool3_bn[0][0]']
pool3_conv (Conv2D) (None, 28, 28, 256) 131072 ['pool3_relu[0][0]']
pool3_pool (AveragePooling2D) (None, 14, 14, 256) 0 ['pool3_conv[0][0]']
conv4_block1_0_bn (BatchNormal (None, 14, 14, 256) 1024 ['pool3_pool[0][0]']
ization)
conv4_block1_0_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block1_0_bn[0][0]']
n)
conv4_block1_1_conv (Conv2D) (None, 14, 14, 128) 32768 ['conv4_block1_0_relu[0][0]']
conv4_block1_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block1_1_conv[0][0]']
ization)
conv4_block1_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block1_1_bn[0][0]']
n)
conv4_block1_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block1_1_relu[0][0]']
conv4_block1_concat (Concatena (None, 14, 14, 288) 0 ['pool3_pool[0][0]',
te) 'conv4_block1_2_conv[0][0]']
conv4_block2_0_bn (BatchNormal (None, 14, 14, 288) 1152 ['conv4_block1_concat[0][0]']
ization)
conv4_block2_0_relu (Activatio (None, 14, 14, 288) 0 ['conv4_block2_0_bn[0][0]']
n)
conv4_block2_1_conv (Conv2D) (None, 14, 14, 128) 36864 ['conv4_block2_0_relu[0][0]']
conv4_block2_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block2_1_conv[0][0]']
ization)
conv4_block2_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block2_1_bn[0][0]']
n)
conv4_block2_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block2_1_relu[0][0]']
conv4_block2_concat (Concatena (None, 14, 14, 320) 0 ['conv4_block1_concat[0][0]',
te) 'conv4_block2_2_conv[0][0]']
conv4_block3_0_bn (BatchNormal (None, 14, 14, 320) 1280 ['conv4_block2_concat[0][0]']
ization)
conv4_block3_0_relu (Activatio (None, 14, 14, 320) 0 ['conv4_block3_0_bn[0][0]']
n)
conv4_block3_1_conv (Conv2D) (None, 14, 14, 128) 40960 ['conv4_block3_0_relu[0][0]']
conv4_block3_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block3_1_conv[0][0]']
ization)
conv4_block3_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block3_1_bn[0][0]']
n)
conv4_block3_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block3_1_relu[0][0]']
conv4_block3_concat (Concatena (None, 14, 14, 352) 0 ['conv4_block2_concat[0][0]',
te) 'conv4_block3_2_conv[0][0]']
conv4_block4_0_bn (BatchNormal (None, 14, 14, 352) 1408 ['conv4_block3_concat[0][0]']
ization)
conv4_block4_0_relu (Activatio (None, 14, 14, 352) 0 ['conv4_block4_0_bn[0][0]']
n)
conv4_block4_1_conv (Conv2D) (None, 14, 14, 128) 45056 ['conv4_block4_0_relu[0][0]']
conv4_block4_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block4_1_conv[0][0]']
ization)
conv4_block4_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block4_1_bn[0][0]']
n)
conv4_block4_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block4_1_relu[0][0]']
conv4_block4_concat (Concatena (None, 14, 14, 384) 0 ['conv4_block3_concat[0][0]',
te) 'conv4_block4_2_conv[0][0]']
conv4_block5_0_bn (BatchNormal (None, 14, 14, 384) 1536 ['conv4_block4_concat[0][0]']
ization)
conv4_block5_0_relu (Activatio (None, 14, 14, 384) 0 ['conv4_block5_0_bn[0][0]']
n)
conv4_block5_1_conv (Conv2D) (None, 14, 14, 128) 49152 ['conv4_block5_0_relu[0][0]']
conv4_block5_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block5_1_conv[0][0]']
ization)
conv4_block5_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block5_1_bn[0][0]']
n)
conv4_block5_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block5_1_relu[0][0]']
conv4_block5_concat (Concatena (None, 14, 14, 416) 0 ['conv4_block4_concat[0][0]',
te) 'conv4_block5_2_conv[0][0]']
conv4_block6_0_bn (BatchNormal (None, 14, 14, 416) 1664 ['conv4_block5_concat[0][0]']
ization)
conv4_block6_0_relu (Activatio (None, 14, 14, 416) 0 ['conv4_block6_0_bn[0][0]']
n)
conv4_block6_1_conv (Conv2D) (None, 14, 14, 128) 53248 ['conv4_block6_0_relu[0][0]']
conv4_block6_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block6_1_conv[0][0]']
ization)
conv4_block6_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block6_1_bn[0][0]']
n)
conv4_block6_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block6_1_relu[0][0]']
conv4_block6_concat (Concatena (None, 14, 14, 448) 0 ['conv4_block5_concat[0][0]',
te) 'conv4_block6_2_conv[0][0]']
conv4_block7_0_bn (BatchNormal (None, 14, 14, 448) 1792 ['conv4_block6_concat[0][0]']
ization)
conv4_block7_0_relu (Activatio (None, 14, 14, 448) 0 ['conv4_block7_0_bn[0][0]']
n)
conv4_block7_1_conv (Conv2D) (None, 14, 14, 128) 57344 ['conv4_block7_0_relu[0][0]']
conv4_block7_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block7_1_conv[0][0]']
ization)
conv4_block7_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block7_1_bn[0][0]']
n)
conv4_block7_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block7_1_relu[0][0]']
conv4_block7_concat (Concatena (None, 14, 14, 480) 0 ['conv4_block6_concat[0][0]',
te) 'conv4_block7_2_conv[0][0]']
conv4_block8_0_bn (BatchNormal (None, 14, 14, 480) 1920 ['conv4_block7_concat[0][0]']
ization)
conv4_block8_0_relu (Activatio (None, 14, 14, 480) 0 ['conv4_block8_0_bn[0][0]']
n)
conv4_block8_1_conv (Conv2D) (None, 14, 14, 128) 61440 ['conv4_block8_0_relu[0][0]']
conv4_block8_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block8_1_conv[0][0]']
ization)
conv4_block8_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block8_1_bn[0][0]']
n)
conv4_block8_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block8_1_relu[0][0]']
conv4_block8_concat (Concatena (None, 14, 14, 512) 0 ['conv4_block7_concat[0][0]',
te) 'conv4_block8_2_conv[0][0]']
conv4_block9_0_bn (BatchNormal (None, 14, 14, 512) 2048 ['conv4_block8_concat[0][0]']
ization)
conv4_block9_0_relu (Activatio (None, 14, 14, 512) 0 ['conv4_block9_0_bn[0][0]']
n)
conv4_block9_1_conv (Conv2D) (None, 14, 14, 128) 65536 ['conv4_block9_0_relu[0][0]']
conv4_block9_1_bn (BatchNormal (None, 14, 14, 128) 512 ['conv4_block9_1_conv[0][0]']
ization)
conv4_block9_1_relu (Activatio (None, 14, 14, 128) 0 ['conv4_block9_1_bn[0][0]']
n)
conv4_block9_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block9_1_relu[0][0]']
conv4_block9_concat (Concatena (None, 14, 14, 544) 0 ['conv4_block8_concat[0][0]',
te) 'conv4_block9_2_conv[0][0]']
conv4_block10_0_bn (BatchNorma (None, 14, 14, 544) 2176 ['conv4_block9_concat[0][0]']
lization)
conv4_block10_0_relu (Activati (None, 14, 14, 544) 0 ['conv4_block10_0_bn[0][0]']
on)
conv4_block10_1_conv (Conv2D) (None, 14, 14, 128) 69632 ['conv4_block10_0_relu[0][0]']
conv4_block10_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block10_1_conv[0][0]']
lization)
conv4_block10_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block10_1_bn[0][0]']
on)
conv4_block10_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block10_1_relu[0][0]']
conv4_block10_concat (Concaten (None, 14, 14, 576) 0 ['conv4_block9_concat[0][0]',
ate) 'conv4_block10_2_conv[0][0]']
conv4_block11_0_bn (BatchNorma (None, 14, 14, 576) 2304 ['conv4_block10_concat[0][0]']
lization)
conv4_block11_0_relu (Activati (None, 14, 14, 576) 0 ['conv4_block11_0_bn[0][0]']
on)
conv4_block11_1_conv (Conv2D) (None, 14, 14, 128) 73728 ['conv4_block11_0_relu[0][0]']
conv4_block11_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block11_1_conv[0][0]']
lization)
conv4_block11_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block11_1_bn[0][0]']
on)
conv4_block11_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block11_1_relu[0][0]']
conv4_block11_concat (Concaten (None, 14, 14, 608) 0 ['conv4_block10_concat[0][0]',
ate) 'conv4_block11_2_conv[0][0]']
conv4_block12_0_bn (BatchNorma (None, 14, 14, 608) 2432 ['conv4_block11_concat[0][0]']
lization)
conv4_block12_0_relu (Activati (None, 14, 14, 608) 0 ['conv4_block12_0_bn[0][0]']
on)
conv4_block12_1_conv (Conv2D) (None, 14, 14, 128) 77824 ['conv4_block12_0_relu[0][0]']
conv4_block12_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block12_1_conv[0][0]']
lization)
conv4_block12_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block12_1_bn[0][0]']
on)
conv4_block12_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block12_1_relu[0][0]']
conv4_block12_concat (Concaten (None, 14, 14, 640) 0 ['conv4_block11_concat[0][0]',
ate) 'conv4_block12_2_conv[0][0]']
conv4_block13_0_bn (BatchNorma (None, 14, 14, 640) 2560 ['conv4_block12_concat[0][0]']
lization)
conv4_block13_0_relu (Activati (None, 14, 14, 640) 0 ['conv4_block13_0_bn[0][0]']
on)
conv4_block13_1_conv (Conv2D) (None, 14, 14, 128) 81920 ['conv4_block13_0_relu[0][0]']
conv4_block13_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block13_1_conv[0][0]']
lization)
conv4_block13_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block13_1_bn[0][0]']
on)
conv4_block13_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block13_1_relu[0][0]']
conv4_block13_concat (Concaten (None, 14, 14, 672) 0 ['conv4_block12_concat[0][0]',
ate) 'conv4_block13_2_conv[0][0]']
conv4_block14_0_bn (BatchNorma (None, 14, 14, 672) 2688 ['conv4_block13_concat[0][0]']
lization)
conv4_block14_0_relu (Activati (None, 14, 14, 672) 0 ['conv4_block14_0_bn[0][0]']
on)
conv4_block14_1_conv (Conv2D) (None, 14, 14, 128) 86016 ['conv4_block14_0_relu[0][0]']
conv4_block14_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block14_1_conv[0][0]']
lization)
conv4_block14_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block14_1_bn[0][0]']
on)
conv4_block14_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block14_1_relu[0][0]']
conv4_block14_concat (Concaten (None, 14, 14, 704) 0 ['conv4_block13_concat[0][0]',
ate) 'conv4_block14_2_conv[0][0]']
conv4_block15_0_bn (BatchNorma (None, 14, 14, 704) 2816 ['conv4_block14_concat[0][0]']
lization)
conv4_block15_0_relu (Activati (None, 14, 14, 704) 0 ['conv4_block15_0_bn[0][0]']
on)
conv4_block15_1_conv (Conv2D) (None, 14, 14, 128) 90112 ['conv4_block15_0_relu[0][0]']
conv4_block15_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block15_1_conv[0][0]']
lization)
conv4_block15_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block15_1_bn[0][0]']
on)
conv4_block15_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block15_1_relu[0][0]']
conv4_block15_concat (Concaten (None, 14, 14, 736) 0 ['conv4_block14_concat[0][0]',
ate) 'conv4_block15_2_conv[0][0]']
conv4_block16_0_bn (BatchNorma (None, 14, 14, 736) 2944 ['conv4_block15_concat[0][0]']
lization)
conv4_block16_0_relu (Activati (None, 14, 14, 736) 0 ['conv4_block16_0_bn[0][0]']
on)
conv4_block16_1_conv (Conv2D) (None, 14, 14, 128) 94208 ['conv4_block16_0_relu[0][0]']
conv4_block16_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block16_1_conv[0][0]']
lization)
conv4_block16_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block16_1_bn[0][0]']
on)
conv4_block16_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block16_1_relu[0][0]']
conv4_block16_concat (Concaten (None, 14, 14, 768) 0 ['conv4_block15_concat[0][0]',
ate) 'conv4_block16_2_conv[0][0]']
conv4_block17_0_bn (BatchNorma (None, 14, 14, 768) 3072 ['conv4_block16_concat[0][0]']
lization)
conv4_block17_0_relu (Activati (None, 14, 14, 768) 0 ['conv4_block17_0_bn[0][0]']
on)
conv4_block17_1_conv (Conv2D) (None, 14, 14, 128) 98304 ['conv4_block17_0_relu[0][0]']
conv4_block17_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block17_1_conv[0][0]']
lization)
conv4_block17_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block17_1_bn[0][0]']
on)
conv4_block17_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block17_1_relu[0][0]']
conv4_block17_concat (Concaten (None, 14, 14, 800) 0 ['conv4_block16_concat[0][0]',
ate) 'conv4_block17_2_conv[0][0]']
conv4_block18_0_bn (BatchNorma (None, 14, 14, 800) 3200 ['conv4_block17_concat[0][0]']
lization)
conv4_block18_0_relu (Activati (None, 14, 14, 800) 0 ['conv4_block18_0_bn[0][0]']
on)
conv4_block18_1_conv (Conv2D) (None, 14, 14, 128) 102400 ['conv4_block18_0_relu[0][0]']
conv4_block18_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block18_1_conv[0][0]']
lization)
conv4_block18_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block18_1_bn[0][0]']
on)
conv4_block18_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block18_1_relu[0][0]']
conv4_block18_concat (Concaten (None, 14, 14, 832) 0 ['conv4_block17_concat[0][0]',
ate) 'conv4_block18_2_conv[0][0]']
conv4_block19_0_bn (BatchNorma (None, 14, 14, 832) 3328 ['conv4_block18_concat[0][0]']
lization)
conv4_block19_0_relu (Activati (None, 14, 14, 832) 0 ['conv4_block19_0_bn[0][0]']
on)
conv4_block19_1_conv (Conv2D) (None, 14, 14, 128) 106496 ['conv4_block19_0_relu[0][0]']
conv4_block19_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block19_1_conv[0][0]']
lization)
conv4_block19_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block19_1_bn[0][0]']
on)
conv4_block19_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block19_1_relu[0][0]']
conv4_block19_concat (Concaten (None, 14, 14, 864) 0 ['conv4_block18_concat[0][0]',
ate) 'conv4_block19_2_conv[0][0]']
conv4_block20_0_bn (BatchNorma (None, 14, 14, 864) 3456 ['conv4_block19_concat[0][0]']
lization)
conv4_block20_0_relu (Activati (None, 14, 14, 864) 0 ['conv4_block20_0_bn[0][0]']
on)
conv4_block20_1_conv (Conv2D) (None, 14, 14, 128) 110592 ['conv4_block20_0_relu[0][0]']
conv4_block20_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block20_1_conv[0][0]']
lization)
conv4_block20_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block20_1_bn[0][0]']
on)
conv4_block20_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block20_1_relu[0][0]']
conv4_block20_concat (Concaten (None, 14, 14, 896) 0 ['conv4_block19_concat[0][0]',
ate) 'conv4_block20_2_conv[0][0]']
conv4_block21_0_bn (BatchNorma (None, 14, 14, 896) 3584 ['conv4_block20_concat[0][0]']
lization)
conv4_block21_0_relu (Activati (None, 14, 14, 896) 0 ['conv4_block21_0_bn[0][0]']
on)
conv4_block21_1_conv (Conv2D) (None, 14, 14, 128) 114688 ['conv4_block21_0_relu[0][0]']
conv4_block21_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block21_1_conv[0][0]']
lization)
conv4_block21_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block21_1_bn[0][0]']
on)
conv4_block21_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block21_1_relu[0][0]']
conv4_block21_concat (Concaten (None, 14, 14, 928) 0 ['conv4_block20_concat[0][0]',
ate) 'conv4_block21_2_conv[0][0]']
conv4_block22_0_bn (BatchNorma (None, 14, 14, 928) 3712 ['conv4_block21_concat[0][0]']
lization)
conv4_block22_0_relu (Activati (None, 14, 14, 928) 0 ['conv4_block22_0_bn[0][0]']
on)
conv4_block22_1_conv (Conv2D) (None, 14, 14, 128) 118784 ['conv4_block22_0_relu[0][0]']
conv4_block22_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block22_1_conv[0][0]']
lization)
conv4_block22_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block22_1_bn[0][0]']
on)
conv4_block22_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block22_1_relu[0][0]']
conv4_block22_concat (Concaten (None, 14, 14, 960) 0 ['conv4_block21_concat[0][0]',
ate) 'conv4_block22_2_conv[0][0]']
conv4_block23_0_bn (BatchNorma (None, 14, 14, 960) 3840 ['conv4_block22_concat[0][0]']
lization)
conv4_block23_0_relu (Activati (None, 14, 14, 960) 0 ['conv4_block23_0_bn[0][0]']
on)
conv4_block23_1_conv (Conv2D) (None, 14, 14, 128) 122880 ['conv4_block23_0_relu[0][0]']
conv4_block23_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block23_1_conv[0][0]']
lization)
conv4_block23_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block23_1_bn[0][0]']
on)
conv4_block23_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block23_1_relu[0][0]']
conv4_block23_concat (Concaten (None, 14, 14, 992) 0 ['conv4_block22_concat[0][0]',
ate) 'conv4_block23_2_conv[0][0]']
conv4_block24_0_bn (BatchNorma (None, 14, 14, 992) 3968 ['conv4_block23_concat[0][0]']
lization)
conv4_block24_0_relu (Activati (None, 14, 14, 992) 0 ['conv4_block24_0_bn[0][0]']
on)
conv4_block24_1_conv (Conv2D) (None, 14, 14, 128) 126976 ['conv4_block24_0_relu[0][0]']
conv4_block24_1_bn (BatchNorma (None, 14, 14, 128) 512 ['conv4_block24_1_conv[0][0]']
lization)
conv4_block24_1_relu (Activati (None, 14, 14, 128) 0 ['conv4_block24_1_bn[0][0]']
on)
conv4_block24_2_conv (Conv2D) (None, 14, 14, 32) 36864 ['conv4_block24_1_relu[0][0]']
conv4_block24_concat (Concaten (None, 14, 14, 1024 0 ['conv4_block23_concat[0][0]',
ate) ) 'conv4_block24_2_conv[0][0]']
pool4_bn (BatchNormalization) (None, 14, 14, 1024 4096 ['conv4_block24_concat[0][0]']
)
pool4_relu (Activation) (None, 14, 14, 1024 0 ['pool4_bn[0][0]']
)
pool4_conv (Conv2D) (None, 14, 14, 512) 524288 ['pool4_relu[0][0]']
pool4_pool (AveragePooling2D) (None, 7, 7, 512) 0 ['pool4_conv[0][0]']
conv5_block1_0_bn (BatchNormal (None, 7, 7, 512) 2048 ['pool4_pool[0][0]']
ization)
conv5_block1_0_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block1_0_bn[0][0]']
n)
conv5_block1_1_conv (Conv2D) (None, 7, 7, 128) 65536 ['conv5_block1_0_relu[0][0]']
conv5_block1_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block1_1_conv[0][0]']
ization)
conv5_block1_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block1_1_bn[0][0]']
n)
conv5_block1_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block1_1_relu[0][0]']
conv5_block1_concat (Concatena (None, 7, 7, 544) 0 ['pool4_pool[0][0]',
te) 'conv5_block1_2_conv[0][0]']
conv5_block2_0_bn (BatchNormal (None, 7, 7, 544) 2176 ['conv5_block1_concat[0][0]']
ization)
conv5_block2_0_relu (Activatio (None, 7, 7, 544) 0 ['conv5_block2_0_bn[0][0]']
n)
conv5_block2_1_conv (Conv2D) (None, 7, 7, 128) 69632 ['conv5_block2_0_relu[0][0]']
conv5_block2_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block2_1_conv[0][0]']
ization)
conv5_block2_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block2_1_bn[0][0]']
n)
conv5_block2_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block2_1_relu[0][0]']
conv5_block2_concat (Concatena (None, 7, 7, 576) 0 ['conv5_block1_concat[0][0]',
te) 'conv5_block2_2_conv[0][0]']
conv5_block3_0_bn (BatchNormal (None, 7, 7, 576) 2304 ['conv5_block2_concat[0][0]']
ization)
conv5_block3_0_relu (Activatio (None, 7, 7, 576) 0 ['conv5_block3_0_bn[0][0]']
n)
conv5_block3_1_conv (Conv2D) (None, 7, 7, 128) 73728 ['conv5_block3_0_relu[0][0]']
conv5_block3_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block3_1_conv[0][0]']
ization)
conv5_block3_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block3_1_bn[0][0]']
n)
conv5_block3_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block3_1_relu[0][0]']
conv5_block3_concat (Concatena (None, 7, 7, 608) 0 ['conv5_block2_concat[0][0]',
te) 'conv5_block3_2_conv[0][0]']
conv5_block4_0_bn (BatchNormal (None, 7, 7, 608) 2432 ['conv5_block3_concat[0][0]']
ization)
conv5_block4_0_relu (Activatio (None, 7, 7, 608) 0 ['conv5_block4_0_bn[0][0]']
n)
conv5_block4_1_conv (Conv2D) (None, 7, 7, 128) 77824 ['conv5_block4_0_relu[0][0]']
conv5_block4_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block4_1_conv[0][0]']
ization)
conv5_block4_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block4_1_bn[0][0]']
n)
conv5_block4_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block4_1_relu[0][0]']
conv5_block4_concat (Concatena (None, 7, 7, 640) 0 ['conv5_block3_concat[0][0]',
te) 'conv5_block4_2_conv[0][0]']
conv5_block5_0_bn (BatchNormal (None, 7, 7, 640) 2560 ['conv5_block4_concat[0][0]']
ization)
conv5_block5_0_relu (Activatio (None, 7, 7, 640) 0 ['conv5_block5_0_bn[0][0]']
n)
conv5_block5_1_conv (Conv2D) (None, 7, 7, 128) 81920 ['conv5_block5_0_relu[0][0]']
conv5_block5_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block5_1_conv[0][0]']
ization)
conv5_block5_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block5_1_bn[0][0]']
n)
conv5_block5_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block5_1_relu[0][0]']
conv5_block5_concat (Concatena (None, 7, 7, 672) 0 ['conv5_block4_concat[0][0]',
te) 'conv5_block5_2_conv[0][0]']
conv5_block6_0_bn (BatchNormal (None, 7, 7, 672) 2688 ['conv5_block5_concat[0][0]']
ization)
conv5_block6_0_relu (Activatio (None, 7, 7, 672) 0 ['conv5_block6_0_bn[0][0]']
n)
conv5_block6_1_conv (Conv2D) (None, 7, 7, 128) 86016 ['conv5_block6_0_relu[0][0]']
conv5_block6_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block6_1_conv[0][0]']
ization)
conv5_block6_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block6_1_bn[0][0]']
n)
conv5_block6_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block6_1_relu[0][0]']
conv5_block6_concat (Concatena (None, 7, 7, 704) 0 ['conv5_block5_concat[0][0]',
te) 'conv5_block6_2_conv[0][0]']
conv5_block7_0_bn (BatchNormal (None, 7, 7, 704) 2816 ['conv5_block6_concat[0][0]']
ization)
conv5_block7_0_relu (Activatio (None, 7, 7, 704) 0 ['conv5_block7_0_bn[0][0]']
n)
conv5_block7_1_conv (Conv2D) (None, 7, 7, 128) 90112 ['conv5_block7_0_relu[0][0]']
conv5_block7_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block7_1_conv[0][0]']
ization)
conv5_block7_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block7_1_bn[0][0]']
n)
conv5_block7_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block7_1_relu[0][0]']
conv5_block7_concat (Concatena (None, 7, 7, 736) 0 ['conv5_block6_concat[0][0]',
te) 'conv5_block7_2_conv[0][0]']
conv5_block8_0_bn (BatchNormal (None, 7, 7, 736) 2944 ['conv5_block7_concat[0][0]']
ization)
conv5_block8_0_relu (Activatio (None, 7, 7, 736) 0 ['conv5_block8_0_bn[0][0]']
n)
conv5_block8_1_conv (Conv2D) (None, 7, 7, 128) 94208 ['conv5_block8_0_relu[0][0]']
conv5_block8_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block8_1_conv[0][0]']
ization)
conv5_block8_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block8_1_bn[0][0]']
n)
conv5_block8_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block8_1_relu[0][0]']
conv5_block8_concat (Concatena (None, 7, 7, 768) 0 ['conv5_block7_concat[0][0]',
te) 'conv5_block8_2_conv[0][0]']
conv5_block9_0_bn (BatchNormal (None, 7, 7, 768) 3072 ['conv5_block8_concat[0][0]']
ization)
conv5_block9_0_relu (Activatio (None, 7, 7, 768) 0 ['conv5_block9_0_bn[0][0]']
n)
conv5_block9_1_conv (Conv2D) (None, 7, 7, 128) 98304 ['conv5_block9_0_relu[0][0]']
conv5_block9_1_bn (BatchNormal (None, 7, 7, 128) 512 ['conv5_block9_1_conv[0][0]']
ization)
conv5_block9_1_relu (Activatio (None, 7, 7, 128) 0 ['conv5_block9_1_bn[0][0]']
n)
conv5_block9_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block9_1_relu[0][0]']
conv5_block9_concat (Concatena (None, 7, 7, 800) 0 ['conv5_block8_concat[0][0]',
te) 'conv5_block9_2_conv[0][0]']
conv5_block10_0_bn (BatchNorma (None, 7, 7, 800) 3200 ['conv5_block9_concat[0][0]']
lization)
conv5_block10_0_relu (Activati (None, 7, 7, 800) 0 ['conv5_block10_0_bn[0][0]']
on)
conv5_block10_1_conv (Conv2D) (None, 7, 7, 128) 102400 ['conv5_block10_0_relu[0][0]']
conv5_block10_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block10_1_conv[0][0]']
lization)
conv5_block10_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block10_1_bn[0][0]']
on)
conv5_block10_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block10_1_relu[0][0]']
conv5_block10_concat (Concaten (None, 7, 7, 832) 0 ['conv5_block9_concat[0][0]',
ate) 'conv5_block10_2_conv[0][0]']
conv5_block11_0_bn (BatchNorma (None, 7, 7, 832) 3328 ['conv5_block10_concat[0][0]']
lization)
conv5_block11_0_relu (Activati (None, 7, 7, 832) 0 ['conv5_block11_0_bn[0][0]']
on)
conv5_block11_1_conv (Conv2D) (None, 7, 7, 128) 106496 ['conv5_block11_0_relu[0][0]']
conv5_block11_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block11_1_conv[0][0]']
lization)
conv5_block11_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block11_1_bn[0][0]']
on)
conv5_block11_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block11_1_relu[0][0]']
conv5_block11_concat (Concaten (None, 7, 7, 864) 0 ['conv5_block10_concat[0][0]',
ate) 'conv5_block11_2_conv[0][0]']
conv5_block12_0_bn (BatchNorma (None, 7, 7, 864) 3456 ['conv5_block11_concat[0][0]']
lization)
conv5_block12_0_relu (Activati (None, 7, 7, 864) 0 ['conv5_block12_0_bn[0][0]']
on)
conv5_block12_1_conv (Conv2D) (None, 7, 7, 128) 110592 ['conv5_block12_0_relu[0][0]']
conv5_block12_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block12_1_conv[0][0]']
lization)
conv5_block12_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block12_1_bn[0][0]']
on)
conv5_block12_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block12_1_relu[0][0]']
conv5_block12_concat (Concaten (None, 7, 7, 896) 0 ['conv5_block11_concat[0][0]',
ate) 'conv5_block12_2_conv[0][0]']
conv5_block13_0_bn (BatchNorma (None, 7, 7, 896) 3584 ['conv5_block12_concat[0][0]']
lization)
conv5_block13_0_relu (Activati (None, 7, 7, 896) 0 ['conv5_block13_0_bn[0][0]']
on)
conv5_block13_1_conv (Conv2D) (None, 7, 7, 128) 114688 ['conv5_block13_0_relu[0][0]']
conv5_block13_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block13_1_conv[0][0]']
lization)
conv5_block13_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block13_1_bn[0][0]']
on)
conv5_block13_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block13_1_relu[0][0]']
conv5_block13_concat (Concaten (None, 7, 7, 928) 0 ['conv5_block12_concat[0][0]',
ate) 'conv5_block13_2_conv[0][0]']
conv5_block14_0_bn (BatchNorma (None, 7, 7, 928) 3712 ['conv5_block13_concat[0][0]']
lization)
conv5_block14_0_relu (Activati (None, 7, 7, 928) 0 ['conv5_block14_0_bn[0][0]']
on)
conv5_block14_1_conv (Conv2D) (None, 7, 7, 128) 118784 ['conv5_block14_0_relu[0][0]']
conv5_block14_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block14_1_conv[0][0]']
lization)
conv5_block14_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block14_1_bn[0][0]']
on)
conv5_block14_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block14_1_relu[0][0]']
conv5_block14_concat (Concaten (None, 7, 7, 960) 0 ['conv5_block13_concat[0][0]',
ate) 'conv5_block14_2_conv[0][0]']
conv5_block15_0_bn (BatchNorma (None, 7, 7, 960) 3840 ['conv5_block14_concat[0][0]']
lization)
conv5_block15_0_relu (Activati (None, 7, 7, 960) 0 ['conv5_block15_0_bn[0][0]']
on)
conv5_block15_1_conv (Conv2D) (None, 7, 7, 128) 122880 ['conv5_block15_0_relu[0][0]']
conv5_block15_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block15_1_conv[0][0]']
lization)
conv5_block15_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block15_1_bn[0][0]']
on)
conv5_block15_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block15_1_relu[0][0]']
conv5_block15_concat (Concaten (None, 7, 7, 992) 0 ['conv5_block14_concat[0][0]',
ate) 'conv5_block15_2_conv[0][0]']
conv5_block16_0_bn (BatchNorma (None, 7, 7, 992) 3968 ['conv5_block15_concat[0][0]']
lization)
conv5_block16_0_relu (Activati (None, 7, 7, 992) 0 ['conv5_block16_0_bn[0][0]']
on)
conv5_block16_1_conv (Conv2D) (None, 7, 7, 128) 126976 ['conv5_block16_0_relu[0][0]']
conv5_block16_1_bn (BatchNorma (None, 7, 7, 128) 512 ['conv5_block16_1_conv[0][0]']
lization)
conv5_block16_1_relu (Activati (None, 7, 7, 128) 0 ['conv5_block16_1_bn[0][0]']
on)
conv5_block16_2_conv (Conv2D) (None, 7, 7, 32) 36864 ['conv5_block16_1_relu[0][0]']
conv5_block16_concat (Concaten (None, 7, 7, 1024) 0 ['conv5_block15_concat[0][0]',
ate) 'conv5_block16_2_conv[0][0]']
bn (BatchNormalization) (None, 7, 7, 1024) 4096 ['conv5_block16_concat[0][0]']
relu (Activation) (None, 7, 7, 1024) 0 ['bn[0][0]']
Flatten_for_hidden_layers (Glo (None, 1024) 0 ['relu[0][0]']
balAveragePooling2D)
Dropout1 (Dropout) (None, 1024) 0 ['Flatten_for_hidden_layers[0][0]
']
Hidden_Layer1 (Dense) (None, 128) 131200 ['Dropout1[0][0]']
Dropout2 (Dropout) (None, 128) 0 ['Hidden_Layer1[0][0]']
Hidden_Layer2 (Dense) (None, 128) 16512 ['Dropout2[0][0]']
Dropout3 (Dropout) (None, 128) 0 ['Hidden_Layer2[0][0]']
Hidden_Layer3 (Dense) (None, 128) 16512 ['Dropout3[0][0]']
output (Dense) (None, 4) 516 ['Hidden_Layer3[0][0]']
==================================================================================================
Total params: 7,202,244
Trainable params: 7,118,596
Non-trainable params: 83,648
__________________________________________________________________________________________________
Performance on UNSEEN TEST Set¶# Plotting the Results on TEST Set
print("\n:::: TEST Set ====> PREDICTION Confusion Matrix ::::\n")
densenet_121_best_model_test_results = confusion_matrix_(y_test, X_test, loaded_model)
# Displaying the overall performance results
print("\n:::: TEST Set ====> FINAL Results ::::\n")
display(densenet_121_best_model_test_results)
:::: TEST Set ====> PREDICTION Confusion Matrix :::: 12/12 [==============================] - 13s 176ms/step
:::: TEST Set ====> FINAL Results ::::
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| BINARY Accuracy | 0.9781 | 0.9699 | 0.9772 | 0.9781 |
| Precision | 0.9279 | 0.9160 | 0.9474 | 0.9562 |
| Recall | 1.0000 | 0.9008 | 0.9512 | 0.9562 |
| Macro F1 Score | 0.9736 | 0.7208 | 0.9909 | 0.9781 |
| Macro ROC AUC Score | 0.9847 | 0.6638 | 0.9938 | 0.9771 |
OBSERVATIONS
Rusty, Scab and Healthy images.Multiple diseases class that has the lowest +ve cases, it is making some false positives and negatives.Multiple Diseases class.Explaining_Best_Model_Predictions¶from tf_explain.core.grad_cam import GradCAM
# Instantiation of the explainer
explainer = GradCAM()
# Creating the output directory
output_dir = pathlib.Path(os.path.join(os.getcwd(), "output"))
os.mkdir(output_dir)
# Clearing the TF session
tf.keras.backend.clear_session()
# Checking the Multiple Diseases images
md_only_records = pd.DataFrame(y_test, columns=cols)
md_only_idx = list(md_only_records[md_only_records['Multiple_Diseases'] == 1].index)
md_only_idx
[2, 9, 68, 88, 90, 142, 185, 188, 210, 211, 217, 222, 256, 291, 298, 360, 361, 364]
def explain_pred(X, y, img_idx, best_model, class_idx, exp=explainer):
"""
"""
# Oputput file name
output_name = "model_pred_{}.png".format(img_idx)
# Invoking the explainer explain method
output = exp.explain([X[img_idx:img_idx+1], y[img_idx]], model=best_model, class_index=class_idx)
# Generating the prediction results
pred_results = pd.DataFrame(np.round(best_model.predict_step(X[img_idx:img_idx+1]).numpy(),3), columns=cols)
display(pred_results)
print("\n")
# Plotting the Prediction Explanation
with plt.style.context('seaborn'):
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14,6), sharex=True, sharey=True)
ax[0].imshow(X[img_idx,:,:,:], aspect='auto')
ax[0].set_title("Original", fontdict= label_font_dict)
ax[0].axis("off")
ax[1].imshow(output, aspect='auto')
ax[1].set_title("Which part of the image Model majorly focussed?", fontdict= label_font_dict)
ax[1].axis("off")
plt.show();
# Saving the output
exp.save(output, output_dir, output_name)
explain_pred(X_test, y_test, md_only_idx[1], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.003 | 0.955 | 0.027 | 0.015 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[7], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.002 | 0.84 | 0.156 | 0.003 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[8], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.121 | 0.466 | 0.321 | 0.092 |
OBSERVATIONS
RUST class.explain_pred(X_test, y_test, md_only_idx[9], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.021 | 0.848 | 0.04 | 0.091 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[15], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.0 | 0.999 | 0.0 | 0.0 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[17], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.001 | 0.984 | 0.01 | 0.005 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[0], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.727 | 0.083 | 0.042 | 0.148 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[3], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.0 | 0.013 | 0.987 | 0.0 |
OBSERVATIONS
RUST class features, although it has focussed on the correct area but unable to capture the features representing the Multiple Disease.explain_pred(X_test, y_test, md_only_idx[14], loaded_model, 1);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.0 | 0.0 | 0.0 | 1.0 |
OBSERVATIONS
SCAB class features.Multiple Disease.Improvement_1¶# loading Models' JSON and creating the Model
with open('DenseNet_Model.json', 'r') as model_json_file2:
loaded_model_json2 = model_json_file2.read()
# Loading the model from json
loaded_model2 = model_from_json(loaded_model_json2)
# load weights into new model
loaded_model2.load_weights("/content/weights-09-0.0277.hdf5")
Performance on UNSEEN TEST Set¶# Plotting the Results on TEST Set
print("\n:::: TEST Set ====> PREDICTION Confusion Matrix ::::\n")
densenet_121_best_model_imp1_test_results = confusion_matrix_(y_test, X_test, loaded_model2)
# Displaying the overall performance results
print("\n:::: TEST Set ====> FINAL Results ::::\n")
display(densenet_121_best_model_imp1_test_results)
:::: TEST Set ====> PREDICTION Confusion Matrix :::: 12/12 [==============================] - 3s 93ms/step
:::: TEST Set ====> FINAL Results ::::
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| BINARY Accuracy | 0.9753 | 0.9589 | 0.9717 | 0.9658 |
| Precision | 0.9608 | 0.8473 | 0.9183 | 0.9315 |
| Recall | 0.9515 | 0.9174 | 0.9593 | 0.9315 |
| Macro F1 Score | 0.9695 | 0.7612 | 0.9970 | 0.9393 |
| Macro ROC AUC Score | 0.9681 | 0.8381 | 0.9979 | 0.9288 |
OBSERVATIONS
Rusty, Scab and Healthy images.Multiple diseases class that has the lowest +ve cases, it is making some false positives and negatives.Multiple Diseases class.Explaining_Best_Model_Predictions¶from tf_explain.core.grad_cam import GradCAM
# Instantiation of the explainer
explainer2 = GradCAM()
explain_pred(X_test, y_test, md_only_idx[1], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.027 | 0.675 | 0.157 | 0.141 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[7], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.0 | 0.739 | 0.261 | 0.0 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[8], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.001 | 0.82 | 0.169 | 0.011 |
OBSERVATIONS
(better than the best model).explain_pred(X_test, y_test, md_only_idx[9], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.001 | 0.892 | 0.065 | 0.042 |
OBSERVATIONS
(better than the best model).explain_pred(X_test, y_test, md_only_idx[15], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.001 | 0.889 | 0.079 | 0.031 |
OBSERVATIONS
(better than the best model).explain_pred(X_test, y_test, md_only_idx[17], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.011 | 0.747 | 0.158 | 0.083 |
OBSERVATIONS
(better than the best model).Mistakes_of_BestModel_corrected_after_Improvement¶explain_pred(X_test, y_test, md_only_idx[0], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.018 | 0.704 | 0.17 | 0.108 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[3], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.001 | 0.508 | 0.489 | 0.002 |
OBSERVATIONS
RUST class features, although it has focussed on the correct area but unable to capture the features representing the Multiple Disease.explain_pred(X_test, y_test, md_only_idx[13], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.276 | 0.353 | 0.076 | 0.295 |
OBSERVATIONS
explain_pred(X_test, y_test, md_only_idx[10], loaded_model2, 1, explainer2);
| Healthy | Multiple_Diseases | Rust | Scab | |
|---|---|---|---|---|
| 0 | 0.027 | 0.653 | 0.09 | 0.231 |
OBSERVATIONS
Improvement_2¶# Loading the required libraries
from keras.metrics import Precision, Recall
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
import xgboost as xgb
# Storing the DL Model with top layers excluded
new_model = tf.keras.models.Model(loaded_model2.input,
loaded_model2.get_layer('Flatten_for_hidden_layers').output)
# Generating the features for X_TRAIN
features_x_train = new_model.predict(X_train)
349/349 [==============================] - 881s 3s/step
# Shape of X_TRAIN features
features_x_train.shape
(11138, 1024)
# Generating the X_TRAIN features
features_x_test = new_model.predict(X_test)
12/12 [==============================] - 34s 3s/step
# Instantiating the Standard Scaler and training it
scaler = StandardScaler()
scaler.fit(features_x_train)
StandardScaler()
# Standardizing the X_TRAIN & X_TEST features
x_tr = scaler.transform(features_x_train)
x_te = scaler.transform(features_x_test)
# Generating the TGT class labels for training & prediction
np.argmax(y_test, axis = 1)
array([2, 2, 1, 3, 3, 3, 2, 3, 2, 1, 3, 2, 3, 2, 2, 3, 3, 0, 0, 3, 2, 2,
2, 3, 3, 3, 3, 2, 3, 0, 0, 2, 3, 3, 0, 3, 0, 3, 2, 2, 2, 2, 2, 2,
3, 3, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 3, 0, 2, 2, 3, 0, 0, 2,
2, 2, 1, 2, 0, 0, 2, 0, 0, 2, 3, 3, 0, 3, 3, 0, 2, 0, 3, 0, 0, 0,
1, 3, 1, 3, 0, 3, 0, 2, 3, 0, 3, 3, 0, 2, 3, 2, 3, 2, 3, 2, 3, 0,
3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 3, 2, 3, 0, 3, 0, 3, 2, 0, 3, 3,
2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 1, 2, 2, 2, 3, 0, 2, 0, 3, 3, 3, 0,
3, 2, 2, 2, 0, 2, 2, 0, 0, 3, 3, 3, 3, 0, 2, 0, 0, 3, 2, 0, 0, 2,
2, 2, 2, 3, 3, 0, 2, 3, 2, 1, 3, 2, 1, 0, 0, 0, 0, 0, 3, 2, 2, 0,
0, 2, 2, 3, 2, 2, 2, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 2, 0, 1, 3, 2,
3, 2, 1, 0, 2, 0, 3, 0, 0, 2, 2, 3, 0, 3, 2, 2, 2, 2, 3, 2, 3, 2,
2, 2, 2, 2, 0, 0, 3, 3, 3, 2, 3, 0, 3, 0, 1, 2, 0, 2, 2, 0, 2, 3,
2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 3, 0, 2, 0, 3, 2, 2, 3, 3, 2, 2, 0,
2, 2, 3, 3, 3, 1, 2, 0, 0, 3, 2, 3, 1, 0, 3, 2, 3, 3, 0, 0, 3, 2,
3, 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, 2, 3, 0, 3, 3, 0, 0, 0, 2, 3, 2,
0, 3, 2, 3, 0, 3, 3, 3, 0, 2, 0, 2, 3, 3, 3, 2, 0, 2, 2, 2, 2, 3,
3, 0, 0, 0, 2, 2, 3, 0, 1, 1, 3, 0, 1])
# Fitting the XGBOOST model with no HPTuning
clf = xgb.XGBClassifier(max_depth = 16, n_estimators = 200)
clf.fit(x_tr, np.argmax(y_train, axis = 1))
XGBClassifier(max_depth=16, n_estimators=200, objective='multi:softprob')
# Generating the prediction on X_TEST
y_pred = clf.predict(x_te)
# Accuracy Score
xgboost_acc = accuracy_score(y_pred, np.argmax(y_test, axis = 1))
print(xgboost_acc)
0.9315068493150684
# Classification Performance report
print(classification_report(y_pred, np.argmax(y_test, axis = 1)))
precision recall f1-score support
0 0.96 0.94 0.95 105
1 0.56 0.48 0.51 21
2 1.00 0.97 0.98 129
3 0.89 0.96 0.93 110
accuracy 0.93 365
macro avg 0.85 0.84 0.84 365
weighted avg 0.93 0.93 0.93 365
def generate_confusion_matrix(y_pred, y_test):
"""
Description : This function is created for generating the confusion matrix results.
"""
c = tf.math.confusion_matrix(y_pred, y_test)
with plt.style.context('seaborn'):
plt.figure(figsize=(12,10))
sns.heatmap(c, annot=True, fmt=".4g")
plt.yticks(ticks=[0,1,2,3],labels=['HL', 'MD', 'RUST', 'SCAB'], rotation=90)
plt.xticks(ticks=[0,1,2,3],labels=['HL', 'MD', 'RUST', 'SCAB'])
# Results on TEST Set
generate_confusion_matrix(y_pred, np.argmax(y_test, axis = 1))
OBSERVATIONS
OVERALL_RESULTS¶